/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._70;

/**
 *
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 *
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._70
 * @ClassName: ClimbingStairs
 * @Author: linyaonan
 * @Date: 2019/10/22 20:39
 */
public class ClimbingStairs {

    public int climbStairs(int n) {
        if (n == 1 || n == 2) {
            return n;
        }
        int i1 = 1;
        int i2 = 2;
        int k = 3;
        while (k <= n) {
            int temp = i1 + i2;
            i1 = i2;
            i2 = temp;
            k++;
        }
        return i2;
    }

    /**
     * 动态规划
     * @param n
     * @return
     */
    public int climbStairs2(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;

        for (int i = 2; i <= n; i++) {
            // 只走一步相当于dp[i - 1] + 1, 只有两步相当于dp[i - 2] + 2
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

}
